#ifndef POLYNOMIAL_H
#define POLYNOMIAL_H

#include <iostream>
#include <vector>
#include <stdexcept>

// 多项式类，提供基本的求导,积分和加法运算
class Polynomial
{
public:
    Polynomial() : coefficient{std::vector<double>(1, 0)} {};
    Polynomial(std::vector<double> v) : coefficient{v} { check(); }
    Polynomial(const Polynomial &p);
    Polynomial &operator=(const Polynomial &p);
    Polynomial &operator=(Polynomial &&p);
    Polynomial diff() const;                         // 求导函数
    Polynomial integral() const;                     // 积分函数
    double evaluate(double x) const;                 // 求值函数
    void set_coef(std::vector<double> v);            // 设置系数
    void set_coef(int degree, double value);         // 设置特定次数系数
    std::vector<double> get_coef() const;            // 获取系数
    int get_order() const;                           // 获取次数
    Polynomial operator+(const Polynomial &p) const; // 重载加法
    Polynomial operator+(double x) const;            // 重载加法
    Polynomial operator-(const Polynomial &p) const; // 重载减法
    Polynomial operator-(double x) const;            // 重载减法
    Polynomial operator*(const Polynomial &p) const; // 重载乘法
    Polynomial operator*(double x) const;            // 重载乘法
    // Polynomial operator/(const Polynomial &p) const; // 重载除法
    Polynomial operator/(double x) const; // 重载除法
    Polynomial operator^(int x) const;    // 重载幂
    void print() const;

    friend Polynomial operator*(double x, const Polynomial &p); // 重载乘法

private:
    std::vector<double> coefficient;

    void check(); // 确保非常数多项式最高次系数不为0
};
#endif
